#include <QDebug>
#include <QFile>
#include "styleloader.h"
#include "logger.h"
#include "my_defs.h"
#include "appmanager.h"


StyleLoader::StyleLoader()
{
    mFallbackImg = ":/icons/document_file.png";
    mHaveErrors = false;
    //    mStyleDialog = sd;
}

bool StyleLoader::loadStyles(QMap<int, Style> &styles)
{ // loads styles to mStyles from dir mCurrentDir
    styles.clear();

    appManager->setStylesLoaded(NoStylesLoaded);
    QDir dir(mCurrentDir);
    QStringList filters;
    filters<<"*.txt";
    dir.setNameFilters(filters);

    QStringList txtFiles = dir.entryList();
    if (txtFiles.size()==0 || txtFiles.size()>1)
    {
        LOG( "StyleLoader::loadStyles",
             QString("Папка %1 повинна існувати і в папці "
                     "повинен бути 1 файл з розширенням *.txt")
             .arg(mCurrentDir), "" );
        return false;
    }

    // format string like "/path/to/app/styles/txtFile.txt"
    QString txtFileName = QString("%1%2%3")
            .arg(mCurrentDir)
            .arg(QDir::separator())
            .arg(txtFiles.at(0));

    txtFileName = QDir::toNativeSeparators(txtFileName);

    QFile txtFile(txtFileName);
    if (!txtFile.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        LOG( "StyleLoader::loadStyles",
             QString("Не можу відкрити файл %1").arg(txtFileName), "" );
        return false;
    }

    bool gotProblem = false;
    QTextStream in(&txtFile);
    while (!in.atEnd()) {
        QString line = in.readLine();
        Style st;
        if ( processLine(line, st) && st.uniqId>=0)
        {// got record, process it
            QFile testImg(st.img);

            if (testImg.exists())
            {
                styles.insert(st.uniqId, st);
                qDebug()<<"Got STYLE: "<<st.uniqId<<", "<<st.name<<", "<<st.img;
            } else {
                LOG( "StyleLoader::loadStyles",
                     QString("Не можу відкрити файл %1").arg(st.img), "" );
                st.img = "";
                gotProblem = true;
                // TODO: cach an error while loading styles
//                return false;
            }
        } // else got comment
    }
    if (gotProblem)
        appManager->setStylesLoaded(SomeStylesLoaded);
    else
        appManager->setStylesLoaded(AllStylesLoaded);
    return true;
}

bool StyleLoader::setDir(QString dir)
{
    QDir d(dir);
    if (d.exists())
    {
        mCurrentDir = d.canonicalPath();
        mCurrentDir = QDir::toNativeSeparators(mCurrentDir);
        return true;
    }

    LOG( "StyleLoader::setDir",
         QString("Папка %1 не існує!").arg(dir), "" );

    return false;
}

bool StyleLoader::processLine(const QString line, Style &style)
{
    style.uniqId=-1;
    if (line.left(2) == "//") return true;

    int indxComma1 = line.indexOf(QString(", "));
    int indxComma2 = line.indexOf(QString(", "), indxComma1 + 1);

    QString id = line.left(indxComma1);
    // TODO: check int
    style.uniqId = id.toInt();

    QString name = line.mid(indxComma1 + 2, indxComma2 - indxComma1 - 2);
    style.name = name;

    QString img = line.right(line.length() - indxComma2 - 2);

    style.name   = name;

    style.img    = QString("%1%2%3")
            .arg(mCurrentDir)
            .arg(QDir::separator())
            .arg(img.toLower());

    return true;
}
